#ifndef SKILL_HH
#define SKILL_HH

#include <functional>
#include <string>

class Character;

enum SkillType {
    FireBall,
    Heal,
    NormalAttack,
    DevastatingStrike,
    ThunderStrike,
    ShadowBurst,
    BloodAttack,
    IronShield,
    GoldenStrike,
    OverloadPulse,
    ExplosiveBlast,
    JuiceSplash,
    HellfireStorm,
    ThunderBird,
    GreatFireball,
    HundredHeal,
    AssaultPierce,
    BleedingWound,
    SoulInfiltration,
    HealSuper
};

class Skill {
public:
    Skill(const std::string& name, const std::string& desc, 
          const std::function<void(Character&, Character&)>& eff); // Constructor with name, description, and effect
    Skill(const Skill&) = delete;                         // Disable copy constructor
    Skill& operator=(const Skill&) = delete;              // Disable copy assignment
    virtual ~Skill() = default;                           // Virtual destructor

    void use(Character& caster, Character& target) const; // Use skill on target

    std::string name;                                     // Skill name
    std::string description;                              // Skill description
private:
    std::function<void(Character&, Character&)> effect;    // Skill effect (function)
};

Skill create(SkillType type, int layer = 1);

#endif // SKILL_HH